//
//  ResponderChainBootcampViewController.m
//  OCUIBootcamp
//
//  Created by 周晓旺 on 2023/11/29.
//

#import "ResponderChainBootcampViewController.h"
#import <Masonry/Masonry.h>

@interface ResponderChainBootcampViewController ()<UITableViewDataSource,UITableViewDelegate>
@property (nonatomic,strong) NSArray *dataArr;

@end

#define K_ScreenWidth UIScreen.mainScreen.bounds.size.width
#define K_ScreenHeight UIScreen.mainScreen.bounds.size.height

static NSString *cellIdentifier = @"cellIdentifier";

@implementation ResponderChainBootcampViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    self.view.backgroundColor = UIColor.yellowColor;
    
    self.dataArr = @[@"点击增加内容"];
    //btn
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(0, 0, K_ScreenWidth, K_ScreenHeight);
    [btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    
    //添加一个输入view
    UIView *bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, K_ScreenWidth, K_ScreenHeight / 3)];
    bgView.backgroundColor = UIColor.lightGrayColor;
    [self.view addSubview:bgView];
    
    //
    UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, K_ScreenHeight  / 3, K_ScreenWidth,  K_ScreenHeight  / 3) style:UITableViewStylePlain];
    //MARK: - 1.如设置bgView为tableView的父视图，则tableView无法响应点击事件的问题
    /*
     1.1响应者链原理
     响应者链是iOS中事件的处理机制，描述了从一个事件发生开始，寻找响应者，最终处理事件或丢弃事件的过程
     分为两步：一个触摸事件发生后，会加入到Application的事件队列中，然后会依次沿着window-> UIViewController—>UIView的顺序向下利用hitTest和pointerInside方法寻找命中者；
     第二步是 根据响应者链从子视图向上寻找事件响应者，也就是寻找绑定了该事件的触发函数的视图。若找到Application仍无法找到响应者则会丢弃事件
     
     1.1.1
     hitTest 是 iOS 中用于响应者链中事件响应查找的方法，它会在视图层次结构中递归地查找能够响应触摸事件的视图对象，并返回最终响应者
     - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
     其中，point 参数表示触摸点在当前视图的坐标系下的位置，event 参数表示触摸事件对象。返回值为最终响应触摸事件的视图对象，如果没有合适的响应视图，则返回 nil。
     
     1.1.2
     pointInside:withEvent: 方法是 UIView 的方法，用于判断指定的点是否在当前视图内。
     - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
     其中，point 表示需要检查的点坐标，event 表示与此事件相关联的事件对象。
     当调用该方法时，系统会首先判断该点是否在当前视图的 bounds 内，如果不在，直接返回 NO；否则继续判断是否在当前视图的子视图中，如果有子视图包含该点，则递归调用该子视图的 pointInside:withEvent: 方法，直到找到包含该点的最底层子视图。
     最后，如果没有子视图包含该点，则当前视图就是最底层的视图，返回 YES，表示该点在当前视图内。
     */
    /*
     1.2产生原因
     如设置bgView为tableView的父视图，因为tableView本身超出父视图范围，响应者链pointerInside返回nil，则tableView无法响应点击事件；
     */
    /*
     解决方案
     所以，将tableView父视图设为self.view，然后置顶tableView
     */
//    [bgView addSubview:tableView];
    [self.view addSubview:tableView];
    [self.view bringSubviewToFront:tableView];
    tableView.dataSource = self;
    tableView.delegate = self;
    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];
    tableView.estimatedRowHeight = 20;
    tableView.rowHeight = UITableViewAutomaticDimension;
    
    [tableView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(bgView.mas_bottom);
        make.left.right.equalTo(self.view);
        make.height.greaterThanOrEqualTo(@45);
    }];
}

- (void)btnClicked {
    NSLog(@"点击了btn");
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return  self.dataArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    NSString *data = self.dataArr[indexPath.row];
    cell.textLabel.text = data;
    return  cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"点击了--%@",indexPath);
    if (indexPath.row == 0) {
        self.dataArr = @[@"点击增加数据",@"点击减少数据1",@"点击减少数据2"];
    } else {
        self.dataArr = @[@"点击增加数据"];
    }
    [tableView reloadData];
    [tableView layoutIfNeeded];
    NSNumber *height = [NSNumber numberWithFloat:45.0 * self.dataArr.count];
    [tableView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view.mas_top).offset(K_ScreenHeight / 3);
        make.left.right.equalTo(self.view);
        make.height.greaterThanOrEqualTo(height);
    }];
}


/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
